home *** CD-ROM | disk | FTP | other *** search
/ PC World Komputer 2010 April / PCWorld0410.iso / hity wydania / Ubuntu 9.10 PL / karmelkowy-koliberek-desktop-9.10-i386-PL.iso / casper / filesystem.squashfs / usr / share / debconf / fix_db.pl < prev    next >
Perl Script  |  2009-10-02  |  2KB  |  80 lines

  1. #!/usr/bin/perl -w
  2. # This file was preprocessed, do not edit!
  3. use strict;
  4. use Debconf::Db;
  5. use Debconf::Log q{warn};
  6.  
  7. Debconf::Db->load;
  8.  
  9. if (! @ARGV || $ARGV[0] ne 'end') {
  10.     my $fix=0;
  11.     my $ok;
  12.     my $counter=0;
  13.     do {
  14.         $ok=1;
  15.     
  16.         my %templates=();
  17.         my $ti=$Debconf::Db::templates->iterator;
  18.         while (my $t=$ti->iterate) {
  19.             $templates{$t}=Debconf::Template->get($t);
  20.         }
  21.     
  22.         my %questions=();
  23.         my $qi=Debconf::Question->iterator;
  24.         while (my $q=$qi->iterate) {
  25.             if (! defined $q->template) {
  26.                 warn "question \"".$q->name."\" has no template field; removing it.";
  27.                 $q->addowner("killme",""); # make sure it has one owner at least, so removal is triggered
  28.                 foreach my $owner (split(/, /, $q->owners)) {
  29.                     $q->removeowner($owner);
  30.                 }
  31.                 $ok=0;
  32.                 $fix=1;
  33.             }
  34.             elsif (! exists $templates{$q->template->template}) {
  35.                 warn "question \"".$q->name."\" uses nonexistant template ".$q->template->template."; removing it.";
  36.                 foreach my $owner (split(/, /, $q->owners)) {
  37.                     $q->removeowner($owner);
  38.                 }
  39.                 $ok=0;
  40.                 $fix=1;
  41.             }
  42.             else {
  43.                 $questions{$q->name}=$q;
  44.             }
  45.         }
  46.         
  47.         foreach my $t (keys %templates) {
  48.             my @owners=$Debconf::Db::templates->owners($t);
  49.             if (! @owners) {
  50.                 warn "template \"$t\" has no owners; removing it.";
  51.                 $Debconf::Db::templates->addowner($t, "killme","");
  52.                 $Debconf::Db::templates->removeowner($t, "killme");
  53.                 $fix=1;
  54.             }
  55.             foreach my $q (@owners) {
  56.                 if (! exists $questions{$q}) {
  57.                     warn "template \"$t\" claims to be used by nonexistant question \"$q\"; removing that.";
  58.                     $Debconf::Db::templates->removeowner($t, $q);
  59.                     $ok=0;
  60.                     $fix=1;
  61.                 }
  62.             }
  63.         }
  64.         $counter++;
  65.     } until ($ok || $counter > 20);
  66.  
  67.     if ($fix) {
  68.         Debconf::Db->save;
  69.         exec($0, "end");
  70.         die "exec of self failed";
  71.     }
  72. }
  73.  
  74. foreach my $templatefile (glob("/var/lib/dpkg/info/*.templates")) {
  75.     my ($package) = $templatefile =~ m:/var/lib/dpkg/info/(.*?).templates:;
  76.         Debconf::Template->load($templatefile, $package);
  77. }
  78.  
  79. Debconf::Db->save;
  80.